home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / F2JW / trans / choice.cpp next >
C/C++ Source or Header  |  1999-08-28  |  3KB  |  142 lines

  1. //
  2. // F2j 出力に関する部分
  3. // 出力先を標準出力から、outputBufferに変える
  4. //
  5. //
  6. #include "stdafx.h"
  7. #include    <stdarg.h>
  8. #include    <string.h>
  9. #include    "f2j.h"
  10. #include    "MyProt.h"
  11. #include    "score.h"
  12.  
  13. #define    OUTPUTBUFFER_SIZE    50000
  14.  
  15. int        outputBufferPtr;
  16. char    outputBuffer[OUTPUTBUFFER_SIZE];
  17.  
  18. void
  19. MyPrintfInit(void)
  20. {
  21.     outputBufferPtr = 0;
  22.     outputBuffer[0] = '\0';
  23. }
  24.  
  25. void
  26. MyPrintf(char *fmt, ...)
  27. {
  28.     va_list    ap;
  29.     char    *p,    *sval;
  30.     int        ival;
  31.     double    dval;
  32.  
  33.     va_start(ap, fmt);
  34.  
  35.      for(p = fmt; *p; p++) {
  36.         if(outputBufferPtr > OUTPUTBUFFER_SIZE - 10) {
  37.             PrintInternalError("Internal Error <MyPrintf>\n");
  38.             exit(-1);
  39.         }
  40.         if(*p != '%') {
  41.             outputBuffer[outputBufferPtr++] = *p;
  42.             outputBuffer[outputBufferPtr] = '\0';
  43.             continue;
  44.         }
  45.         switch(*++p) {
  46.         case 'c':
  47.             ival = va_arg(ap, char);
  48.             sprintf(&outputBuffer[outputBufferPtr], "%c", ival);
  49.             break;
  50.         case 'd':
  51.             ival = va_arg(ap, int);
  52.             sprintf(&outputBuffer[outputBufferPtr], "%d", ival);
  53.             break;
  54.         case 'f':
  55.             dval = va_arg(ap, double);
  56.             sprintf(&outputBuffer[outputBufferPtr], "%f", dval);
  57.             break;
  58.         case 's':
  59.             sval = va_arg(ap, char *);
  60.             sprintf(&outputBuffer[outputBufferPtr], "%s", sval);
  61.             break;
  62.         default:
  63.             sprintf(&outputBuffer[outputBufferPtr], "%c", *p);
  64.             break;
  65.         }
  66.         // Advance the outputBufferPtr
  67.         while(outputBuffer[outputBufferPtr])
  68.             outputBufferPtr++;
  69.         outputBuffer[outputBufferPtr] = '\0';
  70.     }
  71.  
  72.     va_end(ap);
  73. }
  74.  
  75. void
  76. MyPutchar(char c)
  77. {
  78.     outputBuffer[outputBufferPtr++] = c;
  79.     outputBuffer[outputBufferPtr] = '\0';
  80. }
  81.  
  82. void
  83. MyPrintfFlush(int ptr)
  84. {
  85.     JpnPrintf("%s", &outputBuffer[ptr]);
  86. }
  87.  
  88.  
  89. void
  90. PrintOutBestJapanese(TOKEN *start, int maxJapanese)
  91. {
  92.     int    cntJapanese = 1;
  93.     TOKEN    *p = start;
  94.  
  95.     if(start == NULL)    return;
  96.  
  97.     while(1) {
  98.         TOKEN    *best = SelectBestTree(start);
  99.         if(best == NULL)    break;
  100.  
  101.         if(AlreadyPrintedSameJapanese(start, best) == FALSE) {
  102.             MyPrintfFlush(best->value);
  103.             if(cntJapanese++ >= maxJapanese)    break;
  104.         }
  105.         best->prtControl = PRT_CONTROL_DISPLAYED;
  106.     }
  107. }
  108.  
  109. //
  110. // 一番スコアの高い翻訳結果を選ぶ
  111. //
  112. TOKEN
  113. *SelectBestTree(TOKEN *start)
  114. {
  115.     TOKEN    *bestTree = NULL;
  116.     int        bestScore = -30000;
  117.  
  118.     for(TOKEN *p = start; p; p = p->child) {
  119.         if(p->prtControl != PRT_CONTROL_ENABLE)    continue;
  120.         p->scoreSelect = GetTreeScore(p->next, TRUE);
  121.         if(bestScore < p->scoreSelect) {
  122.             bestTree = p;
  123.             bestScore = p->scoreSelect;
  124.         }
  125.     }
  126.     return(bestTree);
  127. }
  128.  
  129. int
  130. AlreadyPrintedSameJapanese(TOKEN *start, TOKEN *best)
  131. {
  132.     TOKEN    *p;
  133.  
  134.     for(p = start; p; p = p->child) {
  135.         if(p == best)    continue;
  136.         if(p->prtControl == PRT_CONTROL_DISPLAYED
  137.         && !strcmp(&outputBuffer[p->value], &outputBuffer[best->value]))
  138.             return(p->value);
  139.     }
  140.     return(0);
  141. }
  142.